<?php
    namespace Core\ORM\Requete;
    /**
     * Permet la création d'un Select SQL
     *
     * @author mpetrini
     */
    class Select extends \Core\ORM\Requete\Requete {
        /**
        * @var \Utils\Tableau|\Core\ORM\Table[] $joins 
        */
        protected $joins;
        
        
        /**
        * Constructeur complet
        * 
        * @param \Core\ORM\Table $table (optional) (default=null)
        * 
        * @return void
        */
        public function __construct($table=null) {
            parent::__construct($table);
            $this->joins = new \Utils\Tableau();
        }
        /**
        * Permet d'ajouter une Table à cette Reqûete
        * 
        * @param \Core\ORM\Table $table
        * 
        * @return boolean 
        */
        public function ajoutTable($table) {
            if($this->from === null) {
                $this->from=$table;
            }
            else {
                $this->joins->append($table);
            }
            //On va ajouter toutes les dépendances de cette Table
            $tables = $table->getTablesLiees();
            foreach($tables as $t) {
                $t->setParent($table);
                $this->ajoutTable($t);
            }
            return true;
        }
        /**
        * Vérifie si la classe passé en paramètre à déja sa Table dans cette Requête
        * 
        * @param string $nomClasse
        * 
        * @return \Core\ORM\Table
        */
        public function hasCetteTable($nomClasse) {
            if($this->from instanceof \Core\ORM\Table && $this->from->getNomClasse() === $nomClasse) {
                return $this->from;
            }
            foreach($this->joins as $table) {
                if($table instanceof \Core\ORM\Table && $table->getNomClasse() === $nomClasse) {
                    return $table;
                }
            }
        }
        /**
        * Servira à générer la Requête SQL 
        * 
        * @return string
        */
        public function creation() {
            $this->sql =  'SELECT '.$this->from->creationRequeteSelect();
            //Select Jointures
            foreach($this->joins as $join) {
                $this->sql .= ','.$join->creationRequeteSelect();
            }
            //FROM + Jointures
            $this->sql .= ' FROM '.$this->from->getNom(). ' '.$this->from->getAlias();
            foreach($this->joins as $join) {
                $this->sql .=   ' INNER JOIN '.$join->getNom().' '.$join->getAlias() . '  ON ' 
                                .$join->getAlias().'.id='.$join->getParent()->getAlias().'.'.$join->getNom().'_id';
            }
            //Where
            $this->sql .= $this->creationWhere();
            return $this->sql;
        }
        /**
        * Execute une requête SQL SELECT préparée
        * 
        * @throws \Core\ORM\Exception\RequeteException
        * 
        * @return \PDOStatement
        */
        public function execution() {
            parent::execution();
            if(empty($this->sql)) {
                $this->creation();
            }
            $ok = \Core\ORM\ORMClasse::$lien->query($this->sql);
            if($ok) {
                return $ok;
            }
            else {
                throw new \Core\ORM\Exception\RequeteException($this->sql);
            }
        }
    }
?>